import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';
import { message } from 'antd';
import config, { getToken, clearToken } from '@/config';

/**
 * 后端统一响应格式接口定义
 */
export interface ApiResponse<T = any> {
  code: number; // 响应状态码
  data: T; // 响应数据
  msg: string; // 响应消息
}

/**
 * 请求配置接口
 */
interface RequestConfig extends AxiosRequestConfig {
  skipErrorHandler?: boolean; // 是否跳过错误处理
}

/**
 * 创建axios实例
 */
const createAxiosInstance = (): AxiosInstance => {
  const instance = axios.create({
    baseURL: config.apiBaseUrl, // 使用配置文件中的API基础地址
    timeout: config.timeout, // 使用配置文件中的超时时间
    headers: {
      'Content-Type': 'application/json', // 默认请求头
    },
  });

  // 请求拦截器 - 添加token到请求头
  instance.interceptors.request.use(
    (config) => {
      // 使用配置文件中的getToken方法获取token
      const token = getToken();
      if (token) {
        // 将token添加到Authorization请求头
        config.headers.Authorization = `Bearer ${token}`;
      }
      return config;
    },
    (error) => {
      // 请求错误处理
      console.error('请求拦截器错误:', error);
      return Promise.reject(error);
    }
  );

  // 响应拦截器 - 统一处理响应
  instance.interceptors.response.use(
    (response: AxiosResponse<ApiResponse>) => {
      const { data } = response;
      
      // 根据后端返回的code字段判断请求状态
      if (data.code === 200) {
        // 请求成功，返回data字段的数据
        return data.data;
      } else if (data.code === 401) {
        // token过期或无效，清除本地token并跳转到登录页
        clearToken();
        message.error('登录已过期，请重新登录');
        // 这里可以添加跳转到登录页的逻辑
        // window.location.href = '/login';
        return Promise.reject(new Error(data.msg));
      } else {
        // 其他错误状态码，显示错误消息
        message.error(data.msg || '请求失败');
        return Promise.reject(new Error(data.msg));
      }
    },
    (error) => {
      // 网络错误或其他axios错误处理
      console.error('响应拦截器错误:', error);
      
      if (error.response) {
        // 服务器返回了错误状态码
        const { status, data } = error.response;
        switch (status) {
          case 400:
            message.error('请求参数错误');
            break;
          case 403:
            message.error('没有权限访问');
            break;
          case 404:
            message.error('请求的资源不存在');
            break;
          case 500:
            message.error('服务器内部错误');
            break;
          default:
            message.error(data?.msg || '请求失败');
        }
      } else if (error.request) {
        // 请求已发出但没有收到响应
        message.error('网络连接失败，请检查网络');
      } else {
        // 其他错误
        message.error('请求配置错误');
      }
      
      return Promise.reject(error);
    }
  );

  return instance;
};

// 创建请求实例
const request = createAxiosInstance();

/**
 * 通用请求方法
 * @param config 请求配置
 * @returns Promise<T>
 */
export const apiRequest = <T = any>(config: RequestConfig): Promise<T> => {
  return request(config);
};

/**
 * GET请求方法
 * @param url 请求地址
 * @param config 请求配置
 * @returns Promise<T>
 */
export const get = <T = any>(url: string, config?: RequestConfig): Promise<T> => {
  return request.get(url, config);
};

/**
 * POST请求方法
 * @param url 请求地址
 * @param data 请求数据
 * @param config 请求配置
 * @returns Promise<T>
 */
export const post = <T = any>(url: string, data?: any, config?: RequestConfig): Promise<T> => {
  return request.post(url, data, config);
};

/**
 * PUT请求方法
 * @param url 请求地址
 * @param data 请求数据
 * @param config 请求配置
 * @returns Promise<T>
 */
export const put = <T = any>(url: string, data?: any, config?: RequestConfig): Promise<T> => {
  return request.put(url, data, config);
};

/**
 * DELETE请求方法
 * @param url 请求地址
 * @param config 请求配置
 * @returns Promise<T>
 */
export const del = <T = any>(url: string, config?: RequestConfig): Promise<T> => {
  return request.delete(url, config);
};

export default request;